Skip to content

Conversation

@maranicolae
Copy link
Owner

Laboratorul 4

Exercițiul 1

Am înregistrat două porturi cu numele "io port 1" și "io port 2" sub id-urile 0x61 și 0x65 folosind request_region. Apoi în funcția de exit eliberat resursele folosind release_region.

Am verificat corectitudinea prin:

root@qemux86:~# cat /proc/ioports | grep 61                                          
  0061-0061 : io port1                                                          
root@qemux86:~# cat /proc/ioports | grep 65                                      
  0065-0065 : io port2   

Când am dat rmmod am observat că nu mai apar aceste informații.

Exercițiul 2

Am definit funcția kbd_interrupt_handler ce va juca rolul de interrupt handler. În aceasta vom afișa un mesaj pe care îl vom observa folosind dmesg. Am folosit request_irq(I8042_KBD_IRQ, kbd_interrupt_handler, IRQF_SHARED, MODULE_NAME, &devs[0]) pentru a asocia handlerul definit anterior.

În caz de eroare sau atunci când se apelează exit am eliberat resursele.

Exercițiul 3

Am citit valoarea de la I8042_DATA_REG și am stocat-o în variabila val (nu este caracter ASCII). Apoi am printat în handler scancode-ul.

În handler am stocat scancode-ul și am verificat daca acesta reprezintă o apăsare sau eliberare. Acțiunea reprezintă o apăsare daca valoarea obținută din scancode & 0x80 este 0. Dacă o tastă a fost apăsată atunci se v decodifica caracterul ASCII asociat apoi se vă stoca în buffer.

Am verificat corectitudinea prin apăsarea unor taste și verificarea output-ului cu tabelul cerinței.
La apăsarea tastei 'a':

IRQ 1: scancode=0x1e (30) pressed=0 ch=a
IRQ: 1, scancode = 0x9e (158,�)
- În cerința exercițiului cred că este o eroare în tabel la linia tastei 'ENTER'
Key Key Press Scancode Key Release Scancode Keycode
ENTER 0x1c 0x9c 0x1c (28)

Exercițiul 4

În funcția get_char am implementat funcționalitatea de a returna caracterul de la indexul get_idx din buffer. Apoi am modificat valoarile din count (decrementare) și get_idx (poziția următoare din buffer-ul circular).

Într-o buclă dependentă de parametrul formal size, am citit caracter cu caracter și am transferat conținutul către bufferul din userspace folosind put_user (am avut grija că aceasta operație să nu se afle intre lock și unlock ale spinlock-ului).

Exercițiul 5

Am completat funcția kbd_write și am adăugat-o pentru operația write în fops. După aceea am completat funcția de reset a bufferului zeroizand conținutul acestuia împreună cu indecșii și dimensiunea acestuia.

Signed-off-by: Mara-Ioana Nicolae<maraioana9967@gmail.com>
Signed-off-by: Mara <maraioana9967@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant